home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / FILENAME.I < prev    next >
Encoding:
Text File  |  1994-03-29  |  11.8 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE FileNames;⓪ (*$Y+, L-*)⓪ ⓪ (*⓪!03.12.90  Fehler bei SplitName behoben, so daß nun kein Fehler mehr mit⓪+68020 passieren dürfte. (D0 war bei CopyA0OnStack-Aufruf um⓪+eins zu hoch, was ggf. ein Byte zuviel kopierte und damit den⓪+Stack überschrieb).⓪!31.01.91  ValidatePath verwendet "fileUpper" statt Strings.Upper⓪!29.03.93  StrToDrv erlaubt nun Drives v. A-Z (bisher A-P)⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;⓪ IMPORT Strings;⓪ FROM MOSGlobals IMPORT FileStr, PathStr, DriveStr, NameStr, SfxStr, PfxStr,⓪(OutOfStack, StringOverflow, fNotDeleted, fPathNotFound, fFileNotFound,⓪(Drive, DriveSet;⓪ ⓪ CONST drvZ = 26;⓪ ⓪ VAR strok: BOOLEAN;⓪ ⓪ ⓪ PROCEDURE fileUpper (VAR s: ARRAY OF CHAR);⓪"(* "Upper" für Dateinamen: berücksichtigt nur die unteren 128 Zeichen *)⓪"VAR n: CARDINAL;⓪"BEGIN⓪$(*⓪$FOR n:= 0 TO HIGH (s) DO⓪&IF s[n]='' THEN RETURN END;⓪&IF s[n]<CHR(128) THEN s[n]:=CAP(s[n]) END⓪$END⓪$*)⓪$ASSEMBLER⓪(MOVE.W  -(A3),D1⓪(MOVE.L  -(A3),A1⓪(CLR.W   D0⓪&luup:⓪(MOVE.B  (A1)+,D0⓪(BEQ     ende⓪(BMI     next⓪(JSR     @CAP    ;/A2⓪(MOVE.B  D0,-1(A1)⓪&next:⓪(DBRA    D1,luup⓪&ende:⓪$END⓪"END fileUpper;⓪ ⓪ ⓪ PROCEDURE copyA0OnStack;⓪"(*⓪#* Kopiert String in A0/D0.W auf Stack und korrigiert A0⓪#*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  (A7)+,(A3)+     ; Rücksprung-Adr retten⓪(MOVE.L  A1,(A3)+        ; A1 retten⓪(MOVE.W  D0,(A3)+        ; D0 retten⓪(ADDQ    #2,D0           ; wichtig: es muß mind. -2- sein!⓪(BCLR    #0,D0           ; SYNC D0⓪(SUBA.W  D0,A7⓪(CMPA.L  A3,A7⓪(BCC     N⓪(TRAP    #6⓪(DC.W    OutOfStack⓪&N MOVE.L  A7,A1⓪(MOVE.W  -2(A3),D0⓪&L MOVE.B  (A0)+,(A1)+⓪(DBEQ    D0,L⓪(MOVE.L  A7,A0⓪(MOVE.W  -(A3),D0⓪(MOVE.L  -(A3),A1⓪(MOVE.L  -(A3),-(A7)     ; und Rücksprung⓪$END⓪"END copyA0OnStack;⓪ ⓪ PROCEDURE ConcatName (REF prefix, suffix: ARRAY OF CHAR; VAR name: ARRAY OF CHAR);⓪"(*$L+*)⓪"VAR s1, s2: SfxStr; n1: NameStr; app: BOOLEAN;⓪"BEGIN⓪$(* aufpassen, da 'prefix'/'suffix' mit 'name' identisch sein können! *)⓪$app:= suffix[0] # 0C;⓪$IF app THEN⓪&Strings.Copy (suffix, Strings.Pos ('.', suffix, 0) + 1, 3, s1, strok);⓪$END;⓪$SplitPath (prefix, name, n1);⓪$SplitName (n1, n1, s2);⓪$Strings.Append (n1, name, strok);⓪$IF app THEN⓪&Strings.Append ('.', name, strok);⓪&Strings.Append (s1, name, strok);⓪$END;⓪"END ConcatName;⓪"(*$L=*)⓪ ⓪ PROCEDURE ConcatPath (REF path, name: ARRAY OF CHAR; VAR fullname: ARRAY OF CHAR);⓪"(*$L+*)⓪"VAR p1: PathStr; n2, n1: NameStr;⓪"BEGIN⓪$(* aufpassen, da 'path'/'name' mit 'fullName' identisch sein können! *)⓪$SplitPath (name, p1, n1);⓪$SplitPath (path, fullname, n2);⓪$Strings.Append (n1, fullname, strok);⓪"END ConcatPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE NameConc ( REF prefix, suffix: ARRAY OF CHAR ): FileStr;⓪"(*$L+*)⓪"VAR n1: FileStr;⓪"BEGIN⓪$ConcatName (prefix, suffix, n1);⓪$RETURN n1⓪"END NameConc;⓪"(*$L=*)⓪ ⓪ PROCEDURE PathConc ( REF path, name: ARRAY OF CHAR ): FileStr;⓪"(*$L+*)⓪"VAR p1: FileStr;⓪"BEGIN⓪$ConcatPath (path, name, p1);⓪$RETURN p1⓪"END PathConc;⓪"(*$L=*)⓪ ⓪ PROCEDURE SplitName ( REF source: ARRAY OF CHAR; VAR prfx, sfx: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(LINK    A5,#0⓪(⓪(MOVE    -(A3),D2⓪(MOVE.L  -(A3),A2        ; sfx⓪(MOVE    -(A3),D1⓪(MOVE.L  -(A3),A1        ; prfx⓪(MOVE    -(A3),D0⓪(MOVE.L  -(A3),A0        ; source⓪(⓪(CMPA.L  A2,A0⓪(BNE     a2NotEqu⓪(JSR     copyA0OnStack⓪(BRA     a1NotEqu⓪&a2NotEqu⓪(CMPA.L  A1,A0⓪(BNE     a1NotEqu⓪(JSR     copyA0OnStack⓪&a1NotEqu⓪(⓪(ADDQ    #1,D0⓪(MOVE    D3,-(A7)⓪(⓪(; Fehler melden, wenn 'prfx' zu klein⓪(CMPI    #7,D1⓪(BEQ     OK1⓪(BHI     OK2⓪(TRAP    #6⓪(DC.W    StringOverflow-$4000        ; callerCaused⓪(ADDQ    #1,D1⓪(BRA     OK3⓪&OK2:⓪(CLR.B   8(A1)⓪&OK1:⓪(MOVEQ   #8,D1⓪&OK3:⓪(⓪(; Fehler melden, wenn 'sfx' zu klein⓪(CMPI    #2,D2⓪(BEQ     OK4⓪(BHI     OK5⓪(TRAP    #6⓪(DC.W    StringOverflow⓪(ADDQ    #1,D2⓪(BRA     OK6⓪&OK5:⓪(CLR.B   3(A2)⓪&OK4:⓪(MOVEQ   #3,D2⓪&OK6:⓪(⓪&L1:⓪(SUBQ    #1,D0⓪(BCS     EMPTY⓪(MOVE.B  (A0)+,D3⓪(BEQ     EMPTY⓪(CMPI.B  #'.',D3⓪(BEQ     POINT⓪(SUBQ    #1,D1⓪(BMI     L1⓪(MOVE.B  D3,(A1)+⓪(BRA     L1⓪(⓪&POINT:⓪(SUBQ    #1,D0⓪(BCS     EMPTY⓪(MOVE.B  (A0)+,D3⓪(BEQ     EMPTY⓪(SUBQ    #1,D2⓪(BCS     EMPTY⓪(MOVE.B  D3,(A2)+⓪(BRA     POINT⓪(⓪&EMPTY:⓪(TST     D1⓪(BLE     EM1⓪(CLR.B   (A1)⓪&EM1:⓪(TST     D2⓪(BLE     EM2⓪(CLR.B   (A2)⓪&EM2:⓪(⓪(MOVE    (A7)+,D3⓪(UNLK    A5⓪$END⓪"END SplitName;⓪ ⓪ PROCEDURE SplitPath ( REF source: ARRAY OF CHAR; VAR path, name: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(LINK    A5,#0⓪(⓪(MOVE.L  -18(A3),A0      ; ADR (source)⓪(MOVE.L  A0,A1⓪(MOVE.W  -14(A3),D0      ; HIGH (source)⓪(MOVE.W  D0,D2⓪(⓪(MOVE.L  A1,D1⓪ len     TST.B   (A1)+⓪(DBEQ    D2,len⓪(BNE     cle⓪(SUBQ.L  #1,A1⓪ cle     SUBA.L  D1,A1⓪(MOVE.W  A1,D1⓪(BEQ     ende0⓪(⓪&lupo:⓪(MOVE.B  -1(A0,D1.W),D2⓪(CMPI.B  #':',D2⓪(BEQ     ende0⓪(CMPI.B  #'\',D2⓪(BEQ     ende0⓪(SUBQ    #1,D1⓪(BNE     lupo⓪&ende0:⓪(⓪(MOVE.L  -12(A3),A1      ; ADR (path)⓪(MOVE.L  -06(A3),A2      ; ADR (name)⓪(⓪(CMPA.L  A2,A0⓪(BNE     a2NotEqu⓪(JSR     copyA0OnStack⓪(BRA     a1NotEqu⓪&a2NotEqu⓪(CMPA.L  A1,A0⓪(BNE     a1NotEqu⓪(JSR     copyA0OnStack⓪&a1NotEqu⓪(⓪(CLR.B   (A1)⓪(CLR.B   (A2)⓪(⓪(MOVEM.L D3-D7,-(A7)⓪(⓪(MOVE.W  -08(A3),D5      ; HIGH (path)⓪(MOVE.W  -(A3),D6        ; HIGH (name)⓪(SUBA.W  #16,A3⓪(⓪(MOVE    #1,-(A7)        ; Flag: Bisher kein Überlauf⓪(⓪(MOVEQ   #0,D2           ; source-counter⓪ l       CMP     D1,D2           ; pos erreicht ?⓪(BGE     scnd⓪(CMP     D0,D2           ; source geleert ?⓪(BHI     err             ; ja.⓪(CMP     D5,D2⓪(BHI     full⓪(MOVE.B  (A0)+,(A1)+⓪ c       BEQ     err2⓪(ADDQ    #1,D2⓪(BRA     l⓪(⓪ full    CLR     (A7)⓪(TST.B   (A0)+⓪(BRA     c⓪(⓪ full2   TST     D7⓪(BNE     full3⓪(TST     D3⓪(BNE     ende⓪ full3   TST.B   (A0)+⓪(BEQ     ende⓪(⓪ err     CMP     D5,D2⓪(BHI     err2⓪(CLR.B   (A1)+           ; Endemarke bei dest1 setzen⓪(⓪ err2    CLR     (A7)⓪(BRA     ende⓪(⓪ scnd    CMP     D5,D2⓪(BHI     scnd0⓪(CLR.B   (A1)+           ; Endemarke bei dest1 setzen⓪ scnd0   MOVEQ   #0,D4⓪(MOVEQ   #0,D3           ; Flag f. prefix/suffix⓪(MOVEQ   #8,D7⓪ l2      CMP     D6,D4           ; dest2 voll ?⓪(BHI     full2⓪(MOVE.B  (A0)+,D1⓪(BEQ     ende2⓪(CMPI.B  #'.',D1⓪(BNE     l22⓪(MOVEQ   #0,D7⓪(TST     D3⓪(BNE     l22⓪(MOVEQ   #1,D3⓪(MOVEQ   #4,D7⓪ l22     TST     D7⓪(BEQ     l21⓪(SUBQ    #1,D7⓪(MOVE.B  D1,(A2)+⓪(ADDQ    #1,D4⓪ l21     ADDQ    #1,D2⓪(CMP     D0,D2⓪(BLS     l2⓪ ende2   CMP     D6,D4⓪(BHI     ende⓪(CLR.B   (A2)+           ; Endemarke bei dest2 setzen⓪ ende⓪(TST.W   (A7)+⓪(BNE     ok⓪(TRAP    #6⓪(DC.W    StringOverflow⓪&ok:⓪(MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪$END⓪"END SplitPath;⓪ ⓪ PROCEDURE FileName   ( REF filename: ARRAY OF CHAR ): NameStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$RETURN name⓪"END FileName;⓪"(*$L=*)⓪ ⓪ PROCEDURE FilePath   ( REF filename: ARRAY OF CHAR ): PathStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$RETURN path⓪"END FilePath;⓪"(*$L=*)⓪ ⓪ PROCEDURE FilePrefix ( REF filename: ARRAY OF CHAR ): PfxStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr; pfx: PfxStr; sfx: SfxStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$SplitName (name, pfx, sfx);⓪$RETURN pfx⓪"END FilePrefix;⓪"(*$L=*)⓪ ⓪ PROCEDURE FileSuffix ( REF filename: ARRAY OF CHAR ): SfxStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr; pfx: PfxStr; sfx: SfxStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$SplitName (name, pfx, sfx);⓪$RETURN sfx⓪"END FileSuffix;⓪"(*$L=*)⓪ ⓪ PROCEDURE DriveToStr ( driveNo: Drive ): DriveStr;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE    -(A3),D0⓪(BEQ     DFT⓪(ADDI.B  #$40,D0⓪(MOVE.B  D0,(A3)+⓪(MOVE.B  #':',(A3)+⓪(RTS⓪&DFT:⓪(CLR     (A3)+⓪$END⓪"END DriveToStr;⓪ ⓪ PROCEDURE StrToDrive ( REF driveStr: ARRAY OF CHAR ): Drive;⓪"BEGIN⓪$ASSEMBLER⓪(CLR     D0⓪(TST.W   -(A3)⓪(MOVE.L  -(A3),A0⓪(BEQ     DFT⓪(TST.B   (A0)⓪(BEQ     DFT⓪(CMPI.B  #':',1(A0)⓪(BNE     DFT⓪(MOVE.B  (A0),D0⓪(CMPI.B  #'Z',D0⓪(BLS     nolower⓪(SUBI.B  #32,D0  ; change to lower case⓪&nolower⓪(SUBI.B  #'A',D0⓪(BCS     err⓪(ADDQ    #1,D0⓪(CMPI.W  #drvZ,D0⓪(BLS     DFT⓪&err⓪(CLR     D0⓪&DFT:⓪(MOVE    D0,(A3)+⓪$END⓪"END StrToDrive;⓪ ⓪ PROCEDURE ValidatePath ( VAR path: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -6(A3),-(A7)⓪(MOVE.W  -2(A3),-(A7)⓪(JSR     fileUpper⓪(MOVE.W  (A7)+,D0⓪(MOVE.L  (A7)+,A0⓪(TST.B   (A0)⓪(BEQ     e⓪&l TST.B   (A0)+⓪(DBEQ    D0,l⓪(BNE     a⓪(SUBQ.L  #1,A0⓪&a SUBQ.L  #1,A0⓪(CMPI.B  #':',(A0)⓪(BEQ     e⓪(CMPI.B  #'\',(A0)⓪(BEQ     e⓪(TST.W   D0⓪(BPL     o⓪(; string ist schon voll!⓪(TRAP    #6⓪(DC.W    StringOverflow⓪(BRA     e⓪&o BEQ     f⓪(CLR.B   2(A0)           ; wenn mit '\' nicht voll, NUL-Zeichen dran⓪&f MOVE.B  #'\',1(A0)⓪&e⓪$END⓪"END ValidatePath;⓪"⓪ PROCEDURE PathValidated ( REF path: ARRAY OF CHAR ): PathStr;⓪"(*$L+*)⓪"VAR newpath: PathStr; ok: BOOLEAN;⓪"BEGIN⓪$Strings.Assign (path, newpath, ok);⓪$ValidatePath (newpath);⓪$RETURN newpath⓪"END PathValidated;⓪"(*$L=*)⓪ ⓪ ⓪ PROCEDURE NameUnique ( REF fileName: ARRAY OF CHAR ): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W  -(A3),D0⓪(MOVE.L  -(A3),A0⓪(MOVEQ   #'?',D1⓪(MOVEQ   #'*',D2⓪&L TST.B   (A0)⓪(BEQ     T⓪(CMP.B   (A0),D1⓪(BEQ     F⓪(CMP.B   (A0)+,D2⓪(BEQ     F⓪(DBRA    D0,L⓪&T MOVE    #1,(A3)+⓪(RTS⓪&F CLR     (A3)+⓪$END⓪"END NameUnique;⓪ ⓪ ⓪ PROCEDURE NameMatching ( REF fileName, wildcard: ARRAY OF CHAR ): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪((*⓪*MOVE.W  -(A3),D1⓪*MOVE.L  -(A3),A1        ; A1: wildcard⓪*MOVE.W  -(A3),D0⓪*MOVE.L  -(A3),A0        ; A0: filename⓪*TST.B   4(A0)⓪*BEQ     F               ; leerer filename ergibt FALSE⓪(*)⓪(LINK    A5,#0⓪ ⓪(MOVE.L  -12(A3),(A3)+⓪(MOVE.W  -08(A3),(A3)+⓪(JSR     fileUpper⓪(MOVE.L  -06(A3),(A3)+⓪(MOVE.W  -02(A3),(A3)+⓪(JSR     fileUpper⓪ ⓪(MOVE.L  -12(A3),A0⓪(TST.B   (A0)⓪(BEQ.W   F               ; leerer filename ergibt FALSE⓪ ⓪(BRA     C0⓪ ⓪%U0 ; Strings auf Stack löschen!⓪(MOVE.L  (A7)+,D0⓪(CLR.L   -(A7)⓪(CLR.L   -(A7)⓪(CLR.W   -(A7)⓪(MOVE.L  A7,(A3)+        ; VAR pfx⓪(MOVE    #8,(A3)+⓪(CLR.L   -(A7)⓪(MOVE.L  A7,(A3)+        ; VAR sfx⓪(MOVE    #3,(A3)+⓪(MOVE.L  D0,-(A7)⓪(JMP     SplitName⓪ ⓪%C0 BSR     U0⓪(BSR     U0⓪(; Stack (alle Strings Null-terminiert):⓪(;  0(A7): sfx(filename)⓪(;  4(A7): pfx(filename)⓪(; 14(A7): sfx(wildcard)⓪(; 18(A7): pfx(wildcard)⓪ ⓪(LEA     18(A7),A0⓪(LEA     4(A7),A1⓪%L1 MOVE.B  (A0)+,D0        ; Zeichen aus 'wildcard'⓪(BEQ     E1              ; filename muß zu ende sein⓪(CMPI.B  #'*',D0⓪(BEQ     T1              ; filename ist egal⓪(CMP.B   (A1)+,D0⓪(BEQ     L1⓪(CMPI.B  #'?',D0⓪(BEQ     L1              ; zeichen ist egal⓪(BRA     F⓪ ⓪%E1 TST.B   (A1)⓪(BNE     F⓪ ⓪%T1 LEA     14(A7),A0⓪(LEA     (A7),A1⓪%L2 MOVE.B  (A0)+,D0⓪(BEQ     S1              ; filename muß zu ende sein⓪(CMPI.B  #'*',D0⓪(BEQ     T               ; filename ist egal⓪(CMP.B   (A1)+,D0⓪(BEQ     L2⓪(CMPI.B  #'?',D0⓪(BEQ     L2              ; zeichen ist egal⓪(BRA     F⓪ ⓪%S1 TST.B   (A1)⓪(BNE     F⓪ ⓪&T MOVE    #1,(A3)+⓪(UNLK    A5⓪(RTS⓪ ⓪&F CLR     (A3)+⓪(UNLK    A5⓪$END⓪"END NameMatching;⓪ ⓪ END FileNames.⓪ ə
  2. (* $FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$000020AC$FFECF05A$00002CAF$FFECF05A$00001E79$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05AÇ$00000195T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000002BD$0000015C$00000164$00000195$0000016B$000002B2$FFEE7904$0000275D$FFE2D09E$00000404$FFF13E0C$00000410$00000404$00001E79$000020AC$00001F6FÿÇé*)
  3.